///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package mrp.persistencia.controller;
//
//import java.io.Serializable;
//import javax.persistence.Query;
//import javax.persistence.EntityNotFoundException;
//import javax.persistence.criteria.CriteriaQuery;
//import javax.persistence.criteria.Root;
//import mrp.persistencia.entity.Pedido;
//import java.util.ArrayList;
//import java.util.List;
//import javax.persistence.EntityManager;
//import javax.persistence.EntityManagerFactory;
//import javax.transaction.UserTransaction;
//import mrp.persistencia.controller.exceptions.IllegalOrphanException;
//import mrp.persistencia.controller.exceptions.NonexistentEntityException;
//import mrp.persistencia.controller.exceptions.PreexistingEntityException;
//import mrp.persistencia.controller.exceptions.RollbackFailureException;
//import mrp.persistencia.entity.Persona;
//
///**
// *
// * @author root
// */
//public class PersonaJpaController implements Serializable {
//
//    public PersonaJpaController(UserTransaction utx, EntityManagerFactory emf) {
//        this.utx = utx;
//        this.emf = emf;
//    }
//    private UserTransaction utx = null;
//    private EntityManagerFactory emf = null;
//
//    public EntityManager getEntityManager() {
//        return emf.createEntityManager();
//    }
//
//    public void create(Persona persona) throws PreexistingEntityException, RollbackFailureException, Exception {
//        if (persona.getPedidoList() == null) {
//            persona.setPedidoList(new ArrayList<Pedido>());
//        }
//        EntityManager em = null;
//        try {
//            utx.begin();
//            em = getEntityManager();
//            List<Pedido> attachedPedidoList = new ArrayList<Pedido>();
//            for (Pedido pedidoListPedidoToAttach : persona.getPedidoList()) {
//                pedidoListPedidoToAttach = em.getReference(pedidoListPedidoToAttach.getClass(), pedidoListPedidoToAttach.getNumeroordencompra());
//                attachedPedidoList.add(pedidoListPedidoToAttach);
//            }
//            persona.setPedidoList(attachedPedidoList);
//            em.persist(persona);
//            for (Pedido pedidoListPedido : persona.getPedidoList()) {
//                mrp.persistencia.entity.Cliente oldClienteFkOfPedidoListPedido = pedidoListPedido.getClienteFk();
//                pedidoListPedido.setClienteFk(persona);
//                pedidoListPedido = em.merge(pedidoListPedido);
//                if (oldClienteFkOfPedidoListPedido != null) {
//                    oldClienteFkOfPedidoListPedido.getPedidoList().remove(pedidoListPedido);
//                    oldClienteFkOfPedidoListPedido = em.merge(oldClienteFkOfPedidoListPedido);
//                }
//            }
//            utx.commit();
//        } catch (Exception ex) {
//            try {
//                utx.rollback();
//            } catch (Exception re) {
//                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
//            }
//            if (findPersona(persona.getNumerocliente()) != null) {
//                throw new PreexistingEntityException("Persona " + persona + " already exists.", ex);
//            }
//            throw ex;
//        } finally {
//            if (em != null) {
//                em.close();
//            }
//        }
//    }
//
//    public void edit(Persona persona) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
//        EntityManager em = null;
//        try {
//            utx.begin();
//            em = getEntityManager();
//            Persona persistentPersona = em.find(Persona.class, persona.getNumerocliente());
//            List<Pedido> pedidoListOld = persistentPersona.getPedidoList();
//            List<Pedido> pedidoListNew = persona.getPedidoList();
//            List<String> illegalOrphanMessages = null;
//            for (Pedido pedidoListOldPedido : pedidoListOld) {
//                if (!pedidoListNew.contains(pedidoListOldPedido)) {
//                    if (illegalOrphanMessages == null) {
//                        illegalOrphanMessages = new ArrayList<String>();
//                    }
//                    illegalOrphanMessages.add("You must retain Pedido " + pedidoListOldPedido + " since its clienteFk field is not nullable.");
//                }
//            }
//            if (illegalOrphanMessages != null) {
//                throw new IllegalOrphanException(illegalOrphanMessages);
//            }
//            List<Pedido> attachedPedidoListNew = new ArrayList<Pedido>();
//            for (Pedido pedidoListNewPedidoToAttach : pedidoListNew) {
//                pedidoListNewPedidoToAttach = em.getReference(pedidoListNewPedidoToAttach.getClass(), pedidoListNewPedidoToAttach.getNumeroordencompra());
//                attachedPedidoListNew.add(pedidoListNewPedidoToAttach);
//            }
//            pedidoListNew = attachedPedidoListNew;
//            persona.setPedidoList(pedidoListNew);
//            persona = em.merge(persona);
//            for (Pedido pedidoListNewPedido : pedidoListNew) {
//                if (!pedidoListOld.contains(pedidoListNewPedido)) {
//                    Persona oldClienteFkOfPedidoListNewPedido = pedidoListNewPedido.getClienteFk();
//                    pedidoListNewPedido.setClienteFk(persona);
//                    pedidoListNewPedido = em.merge(pedidoListNewPedido);
//                    if (oldClienteFkOfPedidoListNewPedido != null && !oldClienteFkOfPedidoListNewPedido.equals(persona)) {
//                        oldClienteFkOfPedidoListNewPedido.getPedidoList().remove(pedidoListNewPedido);
//                        oldClienteFkOfPedidoListNewPedido = em.merge(oldClienteFkOfPedidoListNewPedido);
//                    }
//                }
//            }
//            utx.commit();
//        } catch (Exception ex) {
//            try {
//                utx.rollback();
//            } catch (Exception re) {
//                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
//            }
//            String msg = ex.getLocalizedMessage();
//            if (msg == null || msg.length() == 0) {
//                String id = persona.getNumerocliente();
//                if (findPersona(id) == null) {
//                    throw new NonexistentEntityException("The persona with id " + id + " no longer exists.");
//                }
//            }
//            throw ex;
//        } finally {
//            if (em != null) {
//                em.close();
//            }
//        }
//    }
//
//    public void destroy(String id) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
//        EntityManager em = null;
//        try {
//            utx.begin();
//            em = getEntityManager();
//            Persona persona;
//            try {
//                persona = em.getReference(Persona.class, id);
//                persona.getNumerocliente();
//            } catch (EntityNotFoundException enfe) {
//                throw new NonexistentEntityException("The persona with id " + id + " no longer exists.", enfe);
//            }
//            List<String> illegalOrphanMessages = null;
//            List<Pedido> pedidoListOrphanCheck = persona.getPedidoList();
//            for (Pedido pedidoListOrphanCheckPedido : pedidoListOrphanCheck) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Pedido " + pedidoListOrphanCheckPedido + " in its pedidoList field has a non-nullable clienteFk field.");
//            }
//            if (illegalOrphanMessages != null) {
//                throw new IllegalOrphanException(illegalOrphanMessages);
//            }
//            em.remove(persona);
//            utx.commit();
//        } catch (Exception ex) {
//            try {
//                utx.rollback();
//            } catch (Exception re) {
//                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
//            }
//            throw ex;
//        } finally {
//            if (em != null) {
//                em.close();
//            }
//        }
//    }
//
//    public List<Persona> findPersonaEntities() {
//        return findPersonaEntities(true, -1, -1);
//    }
//
//    public List<Persona> findPersonaEntities(int maxResults, int firstResult) {
//        return findPersonaEntities(false, maxResults, firstResult);
//    }
//
//    private List<Persona> findPersonaEntities(boolean all, int maxResults, int firstResult) {
//        EntityManager em = getEntityManager();
//        try {
//            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
//            cq.select(cq.from(Persona.class));
//            Query q = em.createQuery(cq);
//            if (!all) {
//                q.setMaxResults(maxResults);
//                q.setFirstResult(firstResult);
//            }
//            return q.getResultList();
//        } finally {
//            em.close();
//        }
//    }
//
//    public Persona findPersona(String id) {
//        EntityManager em = getEntityManager();
//        try {
//            return em.find(Persona.class, id);
//        } finally {
//            em.close();
//        }
//    }
//
//    public int getPersonaCount() {
//        EntityManager em = getEntityManager();
//        try {
//            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
//            Root<Persona> rt = cq.from(Persona.class);
//            cq.select(em.getCriteriaBuilder().count(rt));
//            Query q = em.createQuery(cq);
//            return ((Long) q.getSingleResult()).intValue();
//        } finally {
//            em.close();
//        }
//    }
//    
//}
